package test.example;

import java.util.ArrayList;
import java.util.Random;

import main.problemstruktur.Problem;
import main.problemstruktur.Zeitintervall;
import main.service.KnotenService;

public class ExampleProblemService {
	public static Problem getExampleProblem(){
		Problem exampleProblem= new Problem(ExampleConfig.ANZAHL_BEREICHE);
		Random random=new Random();
		for (int j=0;j<ExampleConfig.ANZAHL_SCHUELER;j++){
		int anzahl_Bereiche=(int) Math.round((random.nextGaussian()*ExampleConfig.SIGMA_BEREICHE_PRO_SCHUELER)+ExampleConfig.EX_BEREICHE_PRO_SCHUELER);
		if (anzahl_Bereiche>ExampleConfig.MAX_BEREICHE_PRO_SCHUELER)
			anzahl_Bereiche=ExampleConfig.MAX_BEREICHE_PRO_SCHUELER;
		if (anzahl_Bereiche<ExampleConfig.MIN_BEREICHE_PRO_SCHUELER)
			anzahl_Bereiche=ExampleConfig.MIN_BEREICHE_PRO_SCHUELER;
		System.out.println("Anzahl_Bereiche: "+anzahl_Bereiche);
		ArrayList<Zeitintervall> zeiten=new ArrayList<Zeitintervall>();
		int dauer=(int) Math.round((random.nextGaussian()*ExampleConfig.SIGMA_DAUER)+ExampleConfig.EX_DAUER);
		if (dauer>ExampleConfig.MAX_DAUER)
			dauer=ExampleConfig.MAX_DAUER;
		if (dauer<ExampleConfig.MIN_DAUER)
			dauer=ExampleConfig.MIN_DAUER;
		System.out.println("Dauer: "+dauer);
		for (int i=0;i<anzahl_Bereiche;i++){
			Double randomDouble=random.nextDouble();
			int bereich=(int)Math.round(randomDouble*ExampleConfig.ANZAHL_BEREICHE-0.5);
			int laenge_Zeitintervall=(int) Math.round((random.nextGaussian()*ExampleConfig.SIGMA_LAENGE_PRO_ZEITINTERVALL)+ExampleConfig.EX_LAENGE_PRO_ZEITINTERVALL);
			if (laenge_Zeitintervall>ExampleConfig.MAX_LAENGE_PRO_ZEITINTERVALL)
				laenge_Zeitintervall=ExampleConfig.MAX_LAENGE_PRO_ZEITINTERVALL;
			if (laenge_Zeitintervall<ExampleConfig.MIN_LAENGE_PRO_ZEITINTERVALL)
				laenge_Zeitintervall=ExampleConfig.MIN_LAENGE_PRO_ZEITINTERVALL;
			randomDouble=random.nextDouble();
			int start=(int)Math.round((randomDouble*(ExampleConfig.ANZAHL_ZEITEINHEITEN-laenge_Zeitintervall))+0.5);
			int ende=start+laenge_Zeitintervall;
			Zeitintervall intervall =new Zeitintervall(bereich, start, ende);
			System.out.println("Zeitintervall: Bereich"+bereich+" Start"+start+" Ende"+ende);
			zeiten.add(intervall);
		}
		exampleProblem.add(zeiten,KnotenService.getNextId(), dauer);}
		return exampleProblem;
		
	}
}
